#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Utility functions used across Myapp"""
# Myapp 应用程序中使用的实用函数

import logging
# 导入日志模块，用于记录应用程序的运行信息

import celery
# 导入 Celery 库，用于创建和管理分布式任务队列
from celery.signals import setup_logging, task_prerun
# 从 Celery 信号中导入 setup_logging 和 task_prerun，用于在特定事件发生时执行函数

# Myapp framework imports
# 导入 Myapp 框架相关的模块
from myapp.tasks.config import CeleryConfig
# 从 myapp.tasks.config 模块导入 CeleryConfig 类，用于配置 Celery 应用程序
from myapp.utils.log import set_task_id as set_log_id
# 从 myapp.utils.log 模块导入 set_task_id 函数，并将其重命名为 set_log_id，用于设置任务ID到日志中


# 全局配置，全部celery app。所有任务都挂在这个app下面
# Global configuration for all Celery apps. All tasks are registered under this app.
# conf = app.config
# print(conf)
# 获取CELERY_CONFIG中定义的任务配置，这个是所有任务的统一配置项，所有任务都应用这个配置项。
# Retrieve task configurations defined in CELERY_CONFIG. This is a unified configuration for all tasks, applied to all of them.
# 但这并不是真正的定义任务。因为任务是task修饰定义的。并且是有逻辑的
# However, this is not the actual task definition. Tasks are defined using the @task decorator and contain specific logic.


logger = logging.getLogger(__name__)
# 获取当前模块的日志记录器

celery_app = celery.Celery()
# 创建一个 Celery 应用程序实例
celery_app.config_from_object(CeleryConfig)
# 从 CeleryConfig 对象加载配置到 Celery 应用程序
celery_app.set_default()
# 将此 Celery 应用程序设置为默认应用程序

# 从CELERY_CONFIG中获取定义celery app 的配置（全局设置每个任务的配置，
# Retrieve Celery app configurations from CELERY_CONFIG (global settings for each task,
# 所有对每个worker配置都是多的，因为不同worker只处理部分task）
# all worker-specific configurations are redundant as different workers only handle a subset of tasks).


# @worker_process_init.connect
# # 当 worker 进程初始化时连接信号
# def engine_dispose(*args, **kwargs):
# # 定义 engine_dispose 函数，用于处理 worker 进程初始化时的数据库引擎清理
#     logger.info('prepare exec engine dispose')
# # 记录日志，表示准备执行数据库引擎清理
#     db.get_engine().dispose()
# # 获取数据库引擎并释放资源
#
#
# @task_postrun.connect
# # 当任务执行完成后连接信号
# def close_session(*args, **kwargs):
# # 定义 close_session 函数，用于处理任务执行完成后的数据库会话关闭
#     # Flask SQLAlchemy will automatically create new sessions for you from
#     # # Flask SQLAlchemy 会自动从作用域会话工厂为您创建新的会话
#     # a scoped session factory, given that we are maintaining the same app
#     # # 一个作用域会话工厂，鉴于我们维护相同的应用程序
#     # context, this ensures tasks have a fresh session (e.g. session errors
#     # # 上下文，这确保任务有一个新的会话（例如，会话错误
#     # won't propagate across tasks)
#     # # 不会在任务之间传播）
#     db.session.remove()
# # 移除数据库会话


@task_prerun.connect
# 连接 task_prerun 信号，在任务运行前触发
def set_task_id(task_id, *args, **kwargs):
# 定义 set_task_id 函数，用于在任务运行前设置日志中的任务ID
    set_log_id(task_id)
# 调用 set_log_id 函数，将当前任务的 task_id 设置到日志中


# 禁用celery的日志
# Disable Celery's logging.
@setup_logging.connect
# 连接 setup_logging 信号，用于配置日志系统
def on_setup_logging(**kwargs):
# 定义 on_setup_logging 函数，用于禁用 Celery 的默认日志配置
    pass
# 此处 pass 表示不执行任何操作，从而禁用 Celery 的日志